home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / class / memalloc.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  5KB  |  305 lines

  1.  
  2.  
  3. /*  Copyright (c) 1993-1996 Algorithms Corporation  */
  4. /*  All rights reserved.  */
  5.  
  6.  
  7.  
  8.  
  9. /*  This file automatically generated by dpp - do not edit  */
  10.  
  11. #define    DPP_STRATEGY    2
  12. #define    DPP_FASTWIDE    0
  13.  
  14.  
  15.  
  16. #line 23 "memalloc.d"
  17. #include "dynl.h" 
  18. #include <string.h> 
  19. #include "memalloc.h" 
  20.  
  21.  
  22. typedef struct _header { 
  23.     char status; 
  24.     struct _header *next; 
  25.  
  26.     unsigned rsize; 
  27.     unsigned size; 
  28.  
  29. } Header; 
  30.  
  31. typedef struct _memBlk { 
  32.     struct _memBlk *next; 
  33.     unsigned size; 
  34.  
  35. } MemBlk; 
  36.  
  37.  
  38. typedef struct { 
  39.     unsigned userBytes; 
  40.     Header *h; 
  41. } MAP; 
  42.  
  43. #define SZ(x) (sizeof(Header)*x) 
  44.  
  45. #define RND(n) (((n-1) / sizeof(Header)) + 1) * sizeof(Header); 
  46.  
  47. static MAP Map[] = { 
  48.     {SZ(1)}, 
  49.     {SZ(2)}, 
  50.     {SZ(4)}, 
  51.     {SZ(8)}, 
  52.     {SZ(16)}, 
  53.     {SZ(32)}, 
  54.     {SZ(64)}, 
  55.     {SZ(128)}, 
  56.     {SZ(256)}, 
  57.     {SZ(512)}, 
  58.     {SZ(1024)}, 
  59.     {SZ(2048)}, 
  60.     {0} 
  61. }; 
  62.  
  63.  
  64.  
  65. static MemBlk *MMBP = NULL; 
  66.  
  67. static unsigned DBS = 1024; 
  68.  
  69. static void more_core(unsigned); 
  70. static Header *compact(MemBlk *); 
  71.  
  72. static CRITICALSECTION CS; 
  73. static int CS_init = 0; 
  74.  
  75. void *MA_malloc(unsigned n, void *p) 
  76.  
  77.  
  78.     unsigned sz; 
  79.     int i; 
  80.     Header *h; 
  81.     Header *ph; 
  82.     Header *bh; 
  83.     Header *pbh; 
  84.     unsigned tnb; 
  85.     unsigned nbn; 
  86.     unsigned nbl; 
  87.  
  88.     if (!CS_init) { 
  89.         INITIALIZECRITICALSECTION(CS); 
  90.         CS_init = 1; 
  91.     } 
  92.     ENTERCRITICALSECTION(CS); 
  93.     if (!n) 
  94.         ++n; 
  95.     sz = RND(n); 
  96.  
  97.  
  98.     for (i=1 ; Map[i].userBytes && Map[i].userBytes <= sz ; ++i); 
  99.     i--; 
  100.  
  101.  
  102.  
  103.     for (bh=pbh=ph=NULL, h=Map[i].h ; h ; ph=h, h=h->next) 
  104.         if (h->size == sz) { 
  105.         if (ph) 
  106.             ph->next = h->next; 
  107.         else 
  108.             Map[i].h = h->next; 
  109.         h->status = 'U'; 
  110.         h->next = (Header *) p; 
  111.         h->rsize = n; 
  112.         LEAVECRITICALSECTION(CS); 
  113.         return h+1; 
  114.     } else if (h->size > sz && (!bh || bh->size > h->size)) { 
  115.         pbh = ph; 
  116.         bh = h; 
  117.     } 
  118.  
  119.     if (bh) { 
  120.         if (pbh) 
  121.             pbh->next = bh->next; 
  122.         else 
  123.             Map[i].h = bh->next; 
  124.         bh->status = 'U'; 
  125.         bh->next = (Header *) p; 
  126.         bh->rsize = n; 
  127.         LEAVECRITICALSECTION(CS); 
  128.         return bh+1; 
  129.     } 
  130.  
  131.  
  132.  
  133.     for (i++ ; Map[i].userBytes && !Map[i].h ; ++i); 
  134.  
  135.     if (!Map[i].userBytes) { 
  136.         more_core(n); 
  137.         LEAVECRITICALSECTION(CS); 
  138.         return MA_malloc(n, p); 
  139.     } 
  140.  
  141. #line 152 "memalloc.d"
  142.     h = Map[i].h; 
  143.     Map[i].h = h->next; 
  144.  
  145.     tnb = h->size / sizeof(Header); 
  146.     nbn = sz / sizeof(Header); 
  147.     nbl = tnb - nbn; 
  148.     if (nbl > 5) { 
  149.         bh = h + (nbn + 1); 
  150.         bh->status = 'U'; 
  151.         bh->next = NULL; 
  152.         bh->rsize = bh->size = (nbl - 1) * sizeof(Header); 
  153.         h->size -= nbl * sizeof(Header); 
  154.         MA_free(bh+1); 
  155.     } 
  156.     h->status = 'U'; 
  157.     h->next = (Header *) p; 
  158.     h->rsize = n; 
  159.     LEAVECRITICALSECTION(CS); 
  160.     return h+1; 
  161.  
  162. void *MA_calloc(unsigned n, void *p) 
  163.     p = MA_malloc(n, p); 
  164.     memset(p, 0, n); 
  165.     return p; 
  166.  
  167. void MA_free(void *arg) 
  168.     int i; 
  169.     Header *h = (Header *) arg; 
  170.  
  171.     ENTERCRITICALSECTION(CS); 
  172.     if (!h || (--h)->status != 'U') { 
  173.         LEAVECRITICALSECTION(CS); 
  174.         return; 
  175.     } 
  176.  
  177.  
  178.     for (i=1 ; Map[i].userBytes && Map[i].userBytes <= h->size ; ++i); 
  179.     i--; 
  180.  
  181.     h->status = 'F'; 
  182.     if (h->next) 
  183.         *((char **) h->next) = NULL; 
  184.     h->next = Map[i].h; 
  185.     Map[i].h = h; 
  186.     LEAVECRITICALSECTION(CS); 
  187.  
  188. static void more_core(unsigned n) 
  189.     unsigned sz; 
  190.     unsigned as; 
  191.     MemBlk *mb; 
  192.     Header *h; 
  193.  
  194.     sz = n > DBS ? n : DBS; 
  195.     sz = RND(sz); 
  196.     as = sizeof(MemBlk) + sizeof(Header) + sz; 
  197.     mb = (MemBlk *) malloc(as); 
  198.     if (!mb) { 
  199.         fprintf(stderr, "\nOut of memory.\n"); 
  200.         exit(1); 
  201.     } 
  202.     mb->next = MMBP; 
  203.     MMBP = mb; 
  204.     mb->size = sz + sizeof(Header); 
  205.  
  206.     h = (Header *) (mb+1); 
  207.     h->status = 'U'; 
  208.     h->next = NULL; 
  209.     h->size = sz; 
  210.     MA_free(h+1); 
  211.  
  212. void *MA_realloc(void *arg, unsigned n) 
  213.     char *m; 
  214.     Header *h = (Header *) arg; 
  215.  
  216.     ENTERCRITICALSECTION(CS); 
  217.     if (!h || (--h)->status != 'U') { 
  218.         LEAVECRITICALSECTION(CS); 
  219.         return NULL; 
  220.     } 
  221.     if (h->size >= n) { 
  222.         h->rsize = n; 
  223.         LEAVECRITICALSECTION(CS); 
  224.         return h+1; 
  225.     } 
  226.     m = (char *) MA_malloc(n, h->next); 
  227.     memcpy(m, h+1, h->rsize); 
  228.     h->next = NULL; 
  229.     MA_free(h+1); 
  230.     LEAVECRITICALSECTION(CS); 
  231.     return m; 
  232.  
  233.  
  234. void MA_compact(void) 
  235.     MemBlk *mb; 
  236.     Header *fh, *mfh = NULL; 
  237.     int i; 
  238.  
  239.     ENTERCRITICALSECTION(CS); 
  240.  
  241.     for (mb=MMBP ; mb ; mb = mb->next) { 
  242.         fh = compact(mb); 
  243.         if (fh) { 
  244.             fh->next = mfh; 
  245.             mfh = fh; 
  246.         } 
  247.     } 
  248.  
  249.  
  250.     for (i=0 ; Map[i].userBytes ; ++i) 
  251.         Map[i].h = NULL; 
  252.  
  253.  
  254.     while (fh = mfh) { 
  255.         mfh = fh->next; 
  256.         fh->status = 'U'; 
  257.         fh->next = NULL; 
  258.         MA_free(fh+1); 
  259.     } 
  260.     LEAVECRITICALSECTION(CS); 
  261.  
  262. #define NEXTH(h) (Header *) ((char *) h + (sizeof(Header)+h->size)) 
  263.  
  264. static Header *compact(MemBlk *mb) 
  265.     char *end = (char *) (mb+1) + mb->size; 
  266.     Header *h = (Header *) (mb+1); 
  267.     Header *to, *pto=NULL; 
  268.  
  269.     for (to=h ; (char *) h < end ; h = NEXTH(h)) { 
  270.         if (h->status == 'F') 
  271.             continue; 
  272.         if (to != h) { 
  273.             memcpy(to, h, h->rsize+sizeof(Header)); 
  274.             if (h->next) 
  275.                 *((Header **) to->next) = to + 1; 
  276.         } 
  277.         to->size = RND(to->rsize); 
  278.         pto = to; 
  279.         to = NEXTH(to); 
  280.     } 
  281.     if ((char *) to >= end) 
  282.         return NULL; 
  283.     to->status = 'F'; 
  284.     to->size = (end - (char *) to) - sizeof(Header); 
  285.     if (!to->size) { 
  286.         if (pto) 
  287.             pto->size += to->size + sizeof(Header); 
  288.         return NULL; 
  289.     } 
  290.     return to; 
  291.